{
	// 定义一个Animal类
	class Animal {
		name: string;
		age: number;

		constructor(name: string, age: number) {
			this.name = name;
			this.age = age;
		}

		sayHello() {
			console.log('动物在叫~');
		}
	}
	/*
	 * Dog extends Animal
	 *   - 此时，Animal被称为父类，Dog被称为子类
	 *   - 使用继承后，子类将会拥有父类所有的方法和属性
	 *   - 通过继承可以将多个类中共有的代码写在一个父类中，
	 *       这样只需要写一次即可让所有的子类都同时拥有父类中的属性和方法
	 *       如果希望在子类中添加一些父类中没有的属性或方法直接加就行
	 *   - 如果在子类中添加了和父类相同的方法，则子类方法会覆盖掉父类的方法
	 *       这种子类覆盖掉父类方法的形式，我们称为方法重写
	 *
	 */

  class Dog extends Animal {
		// 定义实例属性
		species: string;

		// 如果在子类中写了构造函数，在子类构造函数中"必须"对父类的构造函数进行调用
    constructor(name: string, age: number, species: string) {
			// 使用super调用父类的构造函数，super就表示当前类的父类
			super(name, age);
			this.species = species;
		}

		sayHello() {
			console.log('汪汪汪~');
		}

		run() {
			console.log(`${this.name}在跑`);
		}
	}

  class Cat extends Animal {
		run() {
			console.log(`${this.name}在跑`);
		}
	}

  const dog = new Dog('小黑', 3,'柯基');
  const cat = new Cat('小黄', 2);
  console.log(dog);
  dog.sayHello();
  dog.run();

  console.log(cat);
  cat.sayHello();
  cat.run();

  


}

